package com.fotkidemo.util;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.fotkidemo.BuildConfig;
import com.fotkidemo.R;


import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;

/**
 * Created with IntelliJ IDEA.
 * User: roma
 * Date: 6/21/12
 * Time: 8:41 PM
 * To change this template use File | Settings | File Templates.
 */

/**
 * Класс отвечает за скачивание фото, сохранение фото в кэше на устройстве, обработку фото из файла
 */
public class ImageDownloader {
    private static final String TAG = "ImageDownloader";

    public ImageDownloader(ProgressBar progressBar) {
        this.progressBar = progressBar;
    }

    private ProgressBar progressBar;

    /**
     * Загрузить фото по указанному адресу.
     * Сохранить фото в файл и в diskcache сохранить путь к данному файлу.
     * В imageView задать фото для отображения.
     * @param url - адрес фото
     * @param imageView
     * @param cache
     */
    public void download(String url, ImageView imageView, DiskCache cache) {
        if (cancelPotentialDownload(url, imageView)) {
            if (BuildConfig.DEBUG)
                Log.d(TAG, new StringBuilder("Get image from url= ").append(url).toString());

            DownloadImageTask task = new DownloadImageTask(imageView, cache);
            DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task);
            imageView.setImageDrawable(downloadedDrawable);
            task.execute(url);
        }
    }

    private boolean cancelPotentialDownload(String url, ImageView imageView) {
        DownloadImageTask task = getDownloadImageTask(imageView);

        if (task != null) {
            String urlImage = task.getUrl();
            if (urlImage == null || !urlImage.equals(url)) {
                task.cancel(true);
            } else {
                return false;
            }
        }
        return true;
    }

    private DownloadImageTask getDownloadImageTask(ImageView imageView) {
        if (imageView != null) {
            Drawable drawable = imageView.getDrawable();
            if (drawable instanceof DownloadedDrawable) {
                DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable;
                return downloadedDrawable.geDownloadImageTask();
            }
        }
        return null;
    }

    private class DownloadedDrawable extends ColorDrawable {
        private final WeakReference<DownloadImageTask> bitmapDownloaderTaskReference;

        public DownloadedDrawable(DownloadImageTask downloadImageTask) {
            super(Color.BLACK);
            bitmapDownloaderTaskReference =
                    new WeakReference<DownloadImageTask>(downloadImageTask);
        }

        public DownloadImageTask geDownloadImageTask() {
            return bitmapDownloaderTaskReference.get();
        }
    }

    //Получить асинхронно файл фото из кэша на устройстве или скачать по ссылке в файл
    private class DownloadImageTask extends AsyncTask<String, String, File> {
        private final WeakReference<ImageView> imageViewReference;
        private String url;
        private DiskCache diskCache;

        public DownloadImageTask(ImageView imageView, DiskCache diskCache) {
            imageViewReference = new WeakReference<ImageView>(imageView);
            this.diskCache = diskCache;
        }

        @Override
        protected void onProgressUpdate(String... urls) {

        }

        @Override
        protected File doInBackground(String... urls) {
            try {
                url = urls[0];
                //publishProgress(url);
                return ImageUtil.getImage(diskCache, urls[0]);
            } catch (IOException e) {
                Log.e(TAG, e.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(File in) {
            if (isCancelled()) {
                in = null;
            }

            if (imageViewReference != null) {
                if (in != null) {
                    ImageView imageView = imageViewReference.get();
                    DownloadImageTask downloadImageTask = getDownloadImageTask(imageView);

                    if (this == downloadImageTask) {
                        if (BuildConfig.DEBUG)
                            Log.d(TAG, new StringBuilder("Decode image from url= ").append(url).toString());

                        DecodeFileTask task = new DecodeFileTask(imageViewReference, url);
                        task.execute(in);
                    }
                }
            }
        }

        public String getUrl() {
            return url;
        }
    }

    //Асинхронно декодировать файл фото в bitmap. Сохранить bitmap в кэш для последуещего быстрого доступа
    private class DecodeFileTask extends AsyncTask<File, Void, Bitmap> {
        private final WeakReference<ImageView> imageViewReference;
        private final String url;

        private DecodeFileTask(WeakReference<ImageView> imageViewReference, String url) {
            this.imageViewReference = imageViewReference;
            this.url = url;
        }

        @Override
        protected Bitmap doInBackground(File... in) {
            return BitmapFactory.decodeFile(in[0].getPath());
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    if (bitmap != null) {
                        BitmapCache.getInstance().put(url, bitmap);
                        imageView.setImageBitmap(bitmap);
                    } else {
                        imageView.setImageResource(R.drawable.empty_photo);
                    }
                }
            }
        }
    }
}
